package com.acceptable.qucun.generic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Controller
@RequestMapping("/test")
public class SecurityTestController {
    // Spring Security
    /*
        默认用户名 user 密码控制台获取 每次启动生成一个
        配置用户名和密码(自定义优先设置)
            方式1: 配置文件 配置项前缀 spring.security.user
            方式2: 配置类
                继承 WebSecurityConfigurerAdapter
                实现 void configure(AuthenticationManagerBuilder) 登录检测 密码加密
                auth.inMemoryAuthentication().withUser(String).password(String).roles(String...)
                注入BCryptPasswordEncoderBean或者inMemoryAuthentication().passwordEncoder(PasswordEncorder).xxx
            方式3: 配置类 + UserDetailsService
                配置类
                    前两步同方式2
                    auth.userDetailsService(UserDetailService).passwordEncoder(PasswordEncoder);
                自定义UserDetailsService的实现类
                    实现 UserDetails loadUserByUsername(String)
                    返回
                        设置好加密后的密码以及权限列表List<GrantedAuthority>
                        org.springframework.security.core.userdetails.User对象
       自定义资源访问控制 上述方式3的基础上
            配置类实现 void configure(HttpSecurity http)
                formLogin() 开启自定义表单登录验证
                loginPage() 登录界面所在url 前后端不分离有效
                loginProcessingUrl() 处理登录表单数据的uri 虚拟地址 无须实现
                defaultSuccessUrl() 登录成功后的界面 该页面必须通过get方式的请求
                permitAll() 确保错误的url也适用于某些设置 ???
                and() 为了便于使用方法连缀
                authorizeRequests().antMatchers() 设置未认证情况下可访问的uri
                anyRequest().authenticated()  未认证情况下任何资源uri都可访问
                csrf().disable() 关闭csrf
     */

    @GetMapping("/success")
    @ResponseBody
    public String success(){
        return "登录成功";
    }

    @GetMapping("/index")
    public String index(){
        return "redirect:/test/success";
    }

    @PostMapping("/login")
    public String login(@RequestAttribute(value = "dataMap", required = false) Map<String, String> dataMap){
        System.out.println("登录");
        return "redirect:/test/index";
    }

}
